home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 1999 August / SGI Freeware 1999 August.iso / dist / fw_xemacs.idb / usr / freeware / lib / xemacs-20.4 / lisp / electric / helper.el.z / helper.el
Encoding:
Text File  |  1998-05-21  |  4.9 KB  |  160 lines

  1. ;;; helper.el --- utility help package supporting help in electric modes
  2.  
  3. ;; Copyright (C) 1985 Free Software Foundation, Inc.
  4.  
  5. ;; Author: K. Shane Hartman
  6. ;; Maintainer: FSF
  7. ;; Keywords: help
  8.  
  9. ;; This file is part of XEmacs.
  10.  
  11. ;; XEmacs is free software; you can redistribute it and/or modify it
  12. ;; under the terms of the GNU General Public License as published by
  13. ;; the Free Software Foundation; either version 2, or (at your option)
  14. ;; any later version.
  15.  
  16. ;; XEmacs is distributed in the hope that it will be useful, but
  17. ;; WITHOUT ANY WARRANTY; without even the implied warranty of
  18. ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  19. ;; General Public License for more details.
  20.  
  21. ;; You should have received a copy of the GNU General Public License
  22. ;; along with XEmacs; see the file COPYING.  If not, write to the Free
  23. ;; Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
  24. ;; 02111-1307, USA.
  25.  
  26. ;;; Synched up with: FSF 19.34.
  27.  
  28. ;;; Code:
  29.  
  30. ;; hey, here's a helping hand.
  31.  
  32. ;; Bind this to a string for <blank> in "... Other keys <blank>".
  33. ;; Helper-help uses this to construct help string when scrolling.
  34. ;; Defaults to "return"
  35. (defvar Helper-return-blurb nil)
  36.  
  37. ;; Keymap implementation doesn't work too well for non-standard loops.
  38. ;; But define it anyway for those who can use it.  Non-standard loops
  39. ;; will probably have to use Helper-help.  You can't autoload the
  40. ;; keymap either.
  41.  
  42.  
  43. (defvar Helper-help-map nil)
  44. (if Helper-help-map
  45.     nil
  46.   (setq Helper-help-map (make-keymap))
  47.   ;(fillarray Helper-help-map 'undefined)
  48.   (define-key Helper-help-map "m" 'Helper-describe-mode)
  49.   (define-key Helper-help-map "b" 'Helper-describe-bindings)
  50.   (define-key Helper-help-map "c" 'Helper-describe-key-briefly)
  51.   (define-key Helper-help-map "k" 'Helper-describe-key)
  52.   ;(define-key Helper-help-map "f" 'Helper-describe-function)
  53.   ;(define-key Helper-help-map "v" 'Helper-describe-variable)
  54.   (define-key Helper-help-map "?" 'Helper-help-options)
  55.   (define-key Helper-help-map (vector help-char) 'Helper-help-options)
  56.   (fset 'Helper-help-map Helper-help-map))
  57.  
  58. (defun Helper-help-scroller ()
  59.   (let ((blurb (or (and (boundp 'Helper-return-blurb)
  60.             Helper-return-blurb)
  61.            "return")))
  62.     (save-window-excursion
  63.       (goto-char (window-start (selected-window)))
  64.       (if (get-buffer-window "*Help*")
  65.       (pop-to-buffer "*Help*")
  66.     (switch-to-buffer "*Help*"))
  67.       (goto-char (point-min))
  68.       (let ((continue t) state)
  69.     (while continue
  70.       (setq state (+ (* 2 (if (pos-visible-in-window-p (point-max)) 1 0))
  71.              (if (pos-visible-in-window-p (point-min)) 1 0)))
  72.       (message
  73.         (nth state
  74.          '("Space forward, Delete back. Other keys %s"
  75.            "Space scrolls forward. Other keys %s"
  76.            "Delete scrolls back. Other keys %s"
  77.            "Type anything to %s"))
  78.         blurb)
  79.       (setq continue (read-char))
  80.       (cond ((and (memq continue '(?\ ?\C-v)) (< state 2))
  81.          (scroll-up))
  82.         ((= continue ?\C-l)
  83.          (recenter))
  84.         ((and (= continue ?\177) (zerop (% state 2)))
  85.          (scroll-down))
  86.         (t (setq continue nil))))))))
  87.  
  88. (defun Helper-help-options ()
  89.   "Describe help options."
  90.   (interactive)
  91.   (message "c (key briefly), m (mode), k (key), b (bindings)")
  92.   ;(message "c (key briefly), m (mode), k (key), v (variable), f (function)")
  93.   (sit-for 4))
  94.  
  95. (defun Helper-describe-key-briefly (key)
  96.   "Briefly describe binding of KEY."
  97.   (interactive "kDescribe key briefly: ")
  98.   (describe-key-briefly key)
  99.   (sit-for 4))
  100.  
  101. (defun Helper-describe-key (key)
  102.   "Describe binding of KEY."
  103.   (interactive "kDescribe key: ")
  104.   (save-window-excursion (describe-key key))
  105.   (Helper-help-scroller))
  106.  
  107. (defun Helper-describe-function ()
  108.   "Describe a function.  Name read interactively."
  109.   (interactive)
  110.   (save-window-excursion (call-interactively 'describe-function))
  111.   (Helper-help-scroller))
  112.  
  113. (defun Helper-describe-variable ()
  114.   "Describe a variable.  Name read interactively."
  115.   (interactive)
  116.   (save-window-excursion (call-interactively 'describe-variable))
  117.   (Helper-help-scroller))
  118.  
  119. (defun Helper-describe-mode ()
  120.   "Describe the current mode."
  121.   (interactive)
  122.   (let ((name mode-name)
  123.     (documentation (documentation major-mode)))
  124.     (save-excursion
  125.       (set-buffer (get-buffer-create "*Help*"))
  126.       (erase-buffer)
  127.       (insert name " Mode\n" documentation)
  128.       (help-mode)))
  129.   (Helper-help-scroller))
  130.  
  131. ;;;###autoload
  132. (defun Helper-describe-bindings ()
  133.   "Describe local key bindings of current mode."
  134.   (interactive)
  135.   (message "Making binding list...")
  136.   (save-window-excursion (describe-bindings))
  137.   (Helper-help-scroller))
  138.  
  139. ;;;###autoload
  140. (defun Helper-help ()
  141.   "Provide help for current mode."
  142.   (interactive)
  143.   (let ((continue t) c)
  144.     (while continue
  145.       (message "Help (Type ? for further options)")
  146.       (setq c (read-key-sequence nil))
  147.       (setq c (lookup-key Helper-help-map c))
  148.       (cond ((eq c 'Helper-help-options)
  149.          (Helper-help-options))
  150.         ((commandp c)
  151.          (call-interactively c)
  152.          (setq continue nil))
  153.         (t
  154.          (ding)
  155.          (setq continue nil))))))
  156.  
  157. (provide 'helper)
  158.  
  159. ;;; helper.el ends here
  160.